home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / idlelib / ParenMatch.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  7KB  |  190 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.4)
  3.  
  4. """ParenMatch -- An IDLE extension for parenthesis matching.
  5.  
  6. When you hit a right paren, the cursor should move briefly to the left
  7. paren.  Paren here is used generically; the matching applies to
  8. parentheses, square brackets, and curly braces.
  9.  
  10. WARNING: This extension will fight with the CallTips extension,
  11. because they both are interested in the KeyRelease-parenright event.
  12. We'll have to fix IDLE to do something reasonable when two or more
  13. extensions what to capture the same event.
  14. """
  15. import PyParse
  16. from EditorWindow import EditorWindow, index2line
  17. from configHandler import idleConf
  18.  
  19. class ParenMatch:
  20.     """Highlight matching parentheses
  21.  
  22.     There are three supported style of paren matching, based loosely
  23.     on the Emacs options.  The style is select based on the
  24.     HILITE_STYLE attribute; it can be changed used the set_style
  25.     method.
  26.  
  27.     The supported styles are:
  28.  
  29.     default -- When a right paren is typed, highlight the matching
  30.         left paren for 1/2 sec.
  31.  
  32.     expression -- When a right paren is typed, highlight the entire
  33.         expression from the left paren to the right paren.
  34.  
  35.     TODO:
  36.         - fix interaction with CallTips
  37.         - extend IDLE with configuration dialog to change options
  38.         - implement rest of Emacs highlight styles (see below)
  39.         - print mismatch warning in IDLE status window
  40.  
  41.     Note: In Emacs, there are several styles of highlight where the
  42.     matching paren is highlighted whenever the cursor is immediately
  43.     to the right of a right paren.  I don't know how to do that in Tk,
  44.     so I haven't bothered.
  45.     """
  46.     menudefs = []
  47.     STYLE = idleConf.GetOption('extensions', 'ParenMatch', 'style', default = 'expression')
  48.     FLASH_DELAY = idleConf.GetOption('extensions', 'ParenMatch', 'flash-delay', type = 'int', default = 500)
  49.     HILITE_CONFIG = idleConf.GetHighlight(idleConf.CurrentTheme(), 'hilite')
  50.     BELL = idleConf.GetOption('extensions', 'ParenMatch', 'bell', type = 'bool', default = 1)
  51.     
  52.     def __init__(self, editwin):
  53.         self.editwin = editwin
  54.         self.text = editwin.text
  55.         self.finder = LastOpenBracketFinder(editwin)
  56.         self.counter = 0
  57.         self._restore = None
  58.         self.set_style(self.STYLE)
  59.  
  60.     
  61.     def set_style(self, style):
  62.         self.STYLE = style
  63.         if style == 'default':
  64.             self.create_tag = self.create_tag_default
  65.             self.set_timeout = self.set_timeout_last
  66.         elif style == 'expression':
  67.             self.create_tag = self.create_tag_expression
  68.             self.set_timeout = self.set_timeout_none
  69.         
  70.  
  71.     
  72.     def flash_open_paren_event(self, event):
  73.         index = self.finder.find(keysym_type(event.keysym))
  74.         if index is None:
  75.             self.warn_mismatched()
  76.             return None
  77.         
  78.         self._restore = 1
  79.         self.create_tag(index)
  80.         self.set_timeout()
  81.  
  82.     
  83.     def check_restore_event(self, event = None):
  84.         if self._restore:
  85.             self.text.tag_delete('paren')
  86.             self._restore = None
  87.         
  88.  
  89.     
  90.     def handle_restore_timer(self, timer_count):
  91.         if timer_count + 1 == self.counter:
  92.             self.check_restore_event()
  93.         
  94.  
  95.     
  96.     def warn_mismatched(self):
  97.         if self.BELL:
  98.             self.text.bell()
  99.         
  100.  
  101.     
  102.     def create_tag_default(self, index):
  103.         '''Highlight the single paren that matches'''
  104.         self.text.tag_add('paren', index)
  105.         self.text.tag_config('paren', self.HILITE_CONFIG)
  106.  
  107.     
  108.     def create_tag_expression(self, index):
  109.         '''Highlight the entire expression'''
  110.         self.text.tag_add('paren', index, 'insert')
  111.         self.text.tag_config('paren', self.HILITE_CONFIG)
  112.  
  113.     
  114.     def set_timeout_none(self):
  115.         '''Highlight will remain until user input turns it off'''
  116.         pass
  117.  
  118.     
  119.     def set_timeout_last(self):
  120.         '''The last highlight created will be removed after .5 sec'''
  121.         self.editwin.text_frame.after(self.FLASH_DELAY, (lambda self = self, c = self.counter: self.handle_restore_timer(c)))
  122.         self.counter = self.counter + 1
  123.  
  124.  
  125.  
  126. def keysym_type(ks):
  127.     if ks == 'parenright' or ks == '(':
  128.         return 'paren'
  129.     
  130.     if ks == 'bracketright' or ks == '[':
  131.         return 'bracket'
  132.     
  133.     if ks == 'braceright' or ks == '{':
  134.         return 'brace'
  135.     
  136.  
  137.  
  138. class LastOpenBracketFinder:
  139.     num_context_lines = EditorWindow.num_context_lines
  140.     indentwidth = EditorWindow.indentwidth
  141.     tabwidth = EditorWindow.tabwidth
  142.     context_use_ps1 = EditorWindow.context_use_ps1
  143.     
  144.     def __init__(self, editwin):
  145.         self.editwin = editwin
  146.         self.text = editwin.text
  147.  
  148.     
  149.     def _find_offset_in_buf(self, lno):
  150.         y = PyParse.Parser(self.indentwidth, self.tabwidth)
  151.         for context in self.num_context_lines:
  152.             startat = max(lno - context, 1)
  153.             startatindex = repr(startat) + '.0'
  154.             rawtext = self.text.get(startatindex, 'insert')[:-1] + '\n'
  155.             y.set_str(rawtext)
  156.             bod = y.find_good_parse_start(self.context_use_ps1, self._build_char_in_string_func(startatindex))
  157.             if bod is not None or startat == 1:
  158.                 break
  159.                 continue
  160.         
  161.         if not bod:
  162.             pass
  163.         y.set_lo(0)
  164.         i = y.get_last_open_bracket_pos()
  165.         return (i, y.str)
  166.  
  167.     
  168.     def find(self, right_keysym_type):
  169.         '''Return the location of the last open paren'''
  170.         lno = index2line(self.text.index('insert'))
  171.         (i, buf) = self._find_offset_in_buf(lno)
  172.         if i is None or keysym_type(buf[i]) != right_keysym_type:
  173.             return None
  174.         
  175.         lines_back = buf[i:].count('\n') - 1
  176.         upto_open = buf[:i]
  177.         j = upto_open.rfind('\n') + 1
  178.         offset = i - j
  179.         return '%d.%d' % (lno - lines_back, offset)
  180.  
  181.     
  182.     def _build_char_in_string_func(self, startindex):
  183.         
  184.         def inner(offset, startindex = startindex, icis = self.editwin.is_char_in_string):
  185.             return icis(startindex + '%dc' % offset)
  186.  
  187.         return inner
  188.  
  189.  
  190.